#!/bin/bash

# 日至保存的位置 
LOGFILE='/var/log/gtp_monitor.log'
# GTP 主程序安装路径
EXEFILE='/usr/bin/gtp'
# 主进程PID保存的位置
PIDFILE='/var/run/gtp.pid'
# 进程的内存使用上限(KB)
MAXMEM=409600
# 进程的CPU占用率上限
MAXCPU=100
# 是否清理的标志
OVERLOAD=0

# 日志记录器
# 参数为：日志级别，消息
logg ()
{
	# 共分两个级别: INFO, ERROR
	local level=${1:='INFO'}
	local message=$2

	message="[GTPMonitor] $level $message"
	
	if ! [ -e $LOGFILE ]; then
		touch $LOGFILE
	fi

	logger $message
}

# 从pid文件中读取主进程的pid
mainpid=`cat $PIDFILE`
# 如果程序没有没有执行则执行之
if ! ps --pid $mainpid ; then
	`$EXEFILE`
	logg 'ERROR' "No Process $mainpid"
	exit
fi

# 根据父进程pid找到子进程集合
childrenpid=`ps --ppid $mainpid -o pid=`

# 检测每一个子进程的资源占用情况，超过限制则将OVERLOAD置1
for childpid in $childrenpid ; do
	mem=`ps --pid $childpid -o vsz=`
	cpu=`ps --pid $childpid -o pcpu=`

	# 跳过分发进程
	if [ $(($mainpid+5)) -eq $childpid ]; then
		continue
	fi

	if [ $mem -gt $MAXMEM ]; then
		OVERLOAD=1
		break
	fi
	
# cpu是浮点型数据，需要按照字符串比较
	if [ "$cpu" = "$MAXCPU" ]; then
		OVERLOAD=1
		break
	fi
done

# 若OVERLOAD被置为1，则杀死所有子进程和父进程
if [ $OVERLOAD -eq 1 ]; then
	killall gtp

	# 重启主进程
	`$EXEFILE`
	logg 'INFO' "GTP processes $mainpid killed and restarted."
fi

